package org.example.ai_chat.util;

import cn.dev33.satoken.stp.SaTokenInfo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

/**
 * 自定义数据返回格式
 * @param <T>
 */
@Data
@Schema(description = "自定义数据返回格式")
public class Result<T> {
    @Schema(description = "状态码")
    private Integer code;

    @Schema(description = "响应信息")
    private String msg;

    @Schema(description = "响应业务数据")
    private T data;


    @Schema(description = "saToken信息")
    SaTokenInfo saTokenInfo;

    public Result() {}

    private static <T> Result<T> build(T data) {
        Result<T> result = new Result<>();
        if (data != null) {
            result.setData(data);
        }
        return result;
    }

    /**
     * 如果枚举类中没有相关返回，可以自定义返回状态码和信息，例如：{"code":8000, "msg":"成功了", "data": null}
     * @param body 业务数据
     * @param code 状态码
     * @param msg 返回信息
     * @return 自定义返回结构
     * @param <T> 泛型，传递不同类型
     */
    public static <T> Result<T> build(T body, Integer code, String msg) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }

    /**
     * @param body 业务数据
     * @param resultCodeEnum 自定义枚举类响应体
     * @return 自定义返回结构
     * @param <T> 泛型，传递不同类型
     */
    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMsg(resultCodeEnum.getMsg());
        return result;
    }

    /**
     * @param body 业务数据
     * @param code 状态码
     * @param msg 响应信息
     * @param saTokenInfo saToken信息
     * @return 自定义返回结构
     * @param <T> 泛型，传递不同类型
     */
    public static <T> Result<T> build(T body, Integer code, String msg, SaTokenInfo saTokenInfo) {
        Result<T> result = build(body);
        result.setCode(code);
        result.setMsg(msg);
        result.setSaTokenInfo(saTokenInfo);
        return result;
    }

    /**
     * @param body 业务数据
     * @param resultCodeEnum 自定义枚举类响应体
     * @param saTokenInfo saToken信息
     * @return 自定义返回结构
     * @param <T> 泛型，传递不同类型
     */
    public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum, SaTokenInfo saTokenInfo) {
        Result<T> result = build(body);
        result.setCode(resultCodeEnum.getCode());
        result.setMsg(resultCodeEnum.getMsg());
        result.setSaTokenInfo(saTokenInfo);
        return result;
    }
}
